/*
 * Gestion del producto "Pelicula"
 */
package gestorvideoclub;

import gestorvideoclub.enumeraciones.*;
import gestorvideoclub.jdbc.*;
import gestorvideoclub.util.introduceDatos;
import java.sql.*;
import java.util.*;
import java.text.*;
import javax.management.timer.Timer;

/**
 *
 * @author Rafa Berral
 */
public class Pelicula extends Producto {

    private int duracion;
    private String director;
    private String reparto;
    private int anyo;
    private String nacionalidad;
    private GeneroPeliculaEnum genero;

    /*
     * Constructores
     *
     */
    public Pelicula() {
    }

    public Pelicula(int cod, String titulo, TipoProductoEnum tipo, ProductoEnum est, String descrip, int edad, double precio, Tarifa t, Ubicacion ub, Proveedor prov, Franquicia franq, int dur, String dir, String rep, int anno, String nac, GeneroPeliculaEnum gen) {
        super(cod, titulo, tipo, est, descrip, edad, precio, t, ub, prov, franq);
        this.duracion = dur;
        this.director = dir;
        this.reparto = rep;
        this.anyo = anno;
        this.nacionalidad = nac;
        this.genero = gen;
    }

    public int getAnyo() {
        return anyo;
    }

    public String getDirector() {
        return director;
    }

    public int getDuracion() {
        return duracion;
    }

    public GeneroPeliculaEnum getGenero() {
        return genero;
    }

    public String getNacionalidad() {
        return nacionalidad;
    }

    public String getReparto() {
        return reparto;
    }

    public void setAnyo(int anyo) {
        this.anyo = anyo;
    }

    public void setDirector(String director) {
        this.director = director;
    }

    public void setDuracion(int duracion) {
        this.duracion = duracion;
    }

    public void setGenero(GeneroPeliculaEnum genero) {
        this.genero = genero;
    }

    public void setNacionalidad(String nacionalidad) {
        this.nacionalidad = nacionalidad;
    }

    public void setReparto(String reparto) {
        this.reparto = reparto;
    }

    @Override
    public boolean equals(Object o) {
        boolean dev = false;
        if (o instanceof Pelicula) {
            Pelicula aux = (Pelicula) o;
            if ((this.getCodigo() == aux.getCodigo())) {
                dev = true;
            } else {
                dev = false;
            }
        }
        return dev;
    }

    @Override
    public int hashCode() {
        int hash = 5;
        hash = 53 * hash + this.duracion;
        hash = 53 * hash + (this.director != null ? this.director.hashCode() : 0);
        hash = 53 * hash + (this.reparto != null ? this.reparto.hashCode() : 0);
        hash = 53 * hash + this.anyo;
        hash = 53 * hash + (this.nacionalidad != null ? this.nacionalidad.hashCode() : 0);
        hash = 53 * hash + (this.genero != null ? this.genero.hashCode() : 0);
        return hash;
    }

    @Override
    public String toString() {
        return super.toString() + " || duracion=" + duracion + "\n|| director=" + director + " || reparto=" + reparto + " || anyo=" + anyo + " || nacionalidad=" + nacionalidad + " || genero=" + genero;
    }

    //@Override
    public static void recorreLista(List l) throws NullPointerException {
        int cont = 1;
        try {
            for (Object p : l) {
                Pelicula aux = (Pelicula) p;
                //comprueba antes si la tarifa de la pelicula ha caducado. 
                //si es asi, cambiamos la tarifa y la actualizamos por una tarifa por defecto
                if (TarifaJDBC.compruebaCaducidadTarifa(aux)) {
                    aux.setTarifa(TarifaJDBC.DevuelveTarifaPorDefecto(aux.getTipo()));
                    PeliculaJDBC.sobreescribePelicula(aux, aux.getCodigo());
                }
                System.out.print("\n---PELICULA NUMERO " + cont + "---");
                System.out.println(aux);
                cont++;
            }
        } catch (NullPointerException e) {
            System.out.println(e.getMessage());
        }
    }
    /*
     * metodo donde damos de baja un videojuego.
     * simplemente actualizamos el estado del producto a "baja"
     */
    @Override
    public void bajaProducto() {
        int numero, codigo = 0;
        boolean salir = false;
        do {
            System.out.println("\nDesea dar de baja una pelicula? Seleccione una opcion:");
            System.out.println("1. Si");
            System.out.println("2. No");
            int op = introduceDatos.introduceEntero2();
            switch (op) {
                case 1:
                    System.out.println("Introduce codigo de pelicula: ");
                    codigo = introduceDatos.introduceEntero2();
                    if (ProductoJDBC.compruebaCodigo(codigo) > 0) {
                        Pelicula peli = PeliculaJDBC.obtenerPeliculaPorId(codigo);
                        peli.setEstado(ProductoEnum.Baja);
                        PeliculaJDBC.modificaEstado(peli);
                        salir = true;
                        System.out.println("Producto Dado de baja.");
                        
                    } else {
                        System.out.println("Pelicula no encontrada");
                    }
                    break;

                case 2:
                    salir = true;
                    break;
                default:
                    System.out.println("Opcion incorrecta");
            }
        } while (!salir);

    }
    /*
     * metodo utilizado para cualquier modificacion del Producto, en este caso la Pelicula
     */
    @Override
    public void modificacionProducto() {
        GeneroPeliculaEnum[] arrayG = rellenaArrayGenero();
        String nombre = null, recoge = "";
        boolean enc = false, listo = false, salir3=false;
        Tarifa t = new Tarifa();
        ProductoEnum[] arrayE = new ProductoEnum[ProductoEnum.values().length]; //Guarda Enumeracion de productos
        //Cargamos generos de peliculas en array
        arrayG = rellenaArrayGenero();
        //Cargamos estados pelicula en array
        arrayE = rellenaArrayProductoEnum();
        int numero, eligeOpcion, codigo = 0, aux, idUbi, idT = 0;
        Pelicula pelicula;
        Ubicacion ubi = new Ubicacion();
        //TODO hacer primero busqueda por codigo, que nos devuelva lista
        System.out.println("Introduzca Codidgo de Pelicula: ");
        codigo = introduceDatos.introduceEntero2();
        //TODO comprobar si el producto pasado existe en BBDD, y si es asi, devuelve objeto
        pelicula = PeliculaJDBC.obtenerPeliculaPorId(codigo);
        try{
            System.out.println(pelicula.toString());//muestra la pelicula
        }catch(NullPointerException e){
            System.out.println("No Existe pelicula");
            salir3 = true;
        } if(!salir3) {
            pelicula.toString();
            do {
                do {
                    System.out.println("Introduce dato que quieres modificar: ");
                    System.out.println("1.- Titulo");
                    System.out.println("2.- Reparto");
                    System.out.println("3.- Descripcion");
                    System.out.println("4.- Duracion");
                    System.out.println("5.- Director");
                    System.out.println("6.- Año");
                    System.out.println("7.- Genero");
                    System.out.println("8.- Nacionalidad");
                    System.out.println("9.- Edad Recomendada");
                    System.out.println("10.- Estado del Producto");
                    System.out.println("11.- Precio Compra");
                    System.out.println("12.- Tarifa");
                    System.out.println("13.- Proveedor");
                    System.out.println("14.- Ubicacion");
                    System.out.println("15.- SALIR");
                    numero = introduceDatos.introduceEntero2();
                } while (numero > 15 || numero < 1);
                switch (numero) {
                    case 1:
                        System.out.println("Introduce Nuevo Titulo: ");
                        pelicula.setTitulo(introduceDatos.introduceString2());
                        break;
                    case 2:
                        System.out.println("Introduce Nuevo Reparto: ");
                        pelicula.setReparto(introduceDatos.introduceString2());
                        break;
                    case 3:
                        System.out.println("Introduce Nueva Descripcion: ");
                        pelicula.setDescripcion(introduceDatos.introduceString2());
                        break;
                    case 4:
                        System.out.println("Introduce Nueva Duracion: ");
                        pelicula.setDuracion(introduceDatos.introduceEntero2());
                        break;
                    case 5:
                        System.out.println("Introduce Nuevo Director: ");
                        pelicula.setDirector(introduceDatos.introduceString2());
                        break;
                    case 6:
                        System.out.println("Introduce Nuevo Año: ");
                        pelicula.setAnyo(introduceDatos.introduceEntero2());
                        break;

                    case 7:
                        listadoGenero();
                        eligeOpcion = recogeOpcion(arrayG.length);
                        pelicula.setGenero(arrayG[eligeOpcion]);
                        break;

                    case 8:
                        System.out.println("Introduce Nuevo Nacionalidad: ");
                        pelicula.setNacionalidad(introduceDatos.introduceString2());
                        break;

                    case 9:
                        System.out.println("Introduce Nueva Edad Recomendada: ");
                        pelicula.setEdadRecomendada(introduceDatos.introduceEntero2());
                        break;

                    case 10:
                        recorreEstadoProducto();
                        eligeOpcion = recogeOpcion(arrayE.length);
                        pelicula.setEstado(arrayE[eligeOpcion]);
                        break;

                    case 11:
                        System.out.println("Introduce Nuevo Precio de Compra: ");
                        pelicula.setPrecioCompraProducto(introduceDatos.introduceDouble2());
                        break;

                    case 12:/* pasamos "TipoProducto" para que nos devuelva un listado de las tarifas
                         * asociadas al tipo de producto pasado y que esten activas en ese momento
                         */
                        List<Tarifa> listaT = tarifasFiltroTipoProductoFecha(pelicula.getTarifa().getTipoProducto());
                        if (listaT.isEmpty()) {
                            System.out.println("No se encontraron tarifas, se aplicara una por defecto");
                            t = TarifaJDBC.DevuelveTarifaPorDefecto(pelicula.getTarifa().getTipoProducto());
                            pelicula.setTarifa(t);
                        } else {
                            recorreListaTarifa(listaT);
                            eligeOpcion = recogeOpcion(listaT.size());
                            pelicula.setTarifa(listaT.get(eligeOpcion));//guarda tarifa elegida en pelicula
                        }
                        break;
                    case 13:
                        List<Proveedor> listaProv = ProveedorJDBC.consultarProveedoresAlta();//la BBDD nos devuelve un listado de Proveedores
                        recorreListaProveedor(listaProv);
                        eligeOpcion = recogeOpcion(listaProv.size());
                        pelicula.setProveedor(listaProv.get(eligeOpcion));//guarda proveedor elegido en pelicula
                        break;

                    case 14:
                        System.out.println("Pelicula ubicada en " + pelicula.getUbicacion().getPosicionamiento() + ", cambiar (s/n):");
                        recoge = introduceDatos.introduceString2();
                        do {
                            if (recoge.compareToIgnoreCase("s") == 0 || recoge.compareToIgnoreCase("n") == 0) {
                                listo = true;
                            } else {
                                System.out.println("Introduzca s/n por favor: ");
                                recoge = introduceDatos.introduceString2();
                            }
                        } while (!listo);

                        //comprobamos si el producto está en cajero
                        if (recoge.compareToIgnoreCase("s") == 0 && pelicula.getUbicacion().getPosicionamiento().compareTo("Cajero") == 0) {
                            //recogemos ubicacion antigua y la dejamos libre
                            ubi = pelicula.getUbicacion();
                            ubi.setOcupado(false);
                            UbicacionJDBC.modificaUbicacion(ubi);
                            ubi.setId(1);

                        } else if (recoge.compareToIgnoreCase("s") == 0 && pelicula.getUbicacion().getPosicionamiento().compareTo("Tienda") == 0) {
                            //buscamos ubicacion nueva y la añadimos
                            idUbi = UbicacionJDBC.BuscaIdUbicacionLibre();
                            if (idUbi != -1) {
                                ubi = UbicacionJDBC.devuelveUbicacion(idUbi);
                                ubi.setPosicionamiento("Cajero");
                                UbicacionJDBC.insertaUbicacion(ubi);


                            } else {
                                System.out.println("ERROR! CAJERO LLENO, el producto se asignara a tienda");
                                ubi.setPosicionamiento("Tienda");
                                ubi.setId(1);
                                ubi.setColumna(-1);
                                ubi.setFila(-1);
                                ubi.setOcupado(true);
                            }
                        }
                        pelicula.setUbicacion(ubi);
                        break;

                    default:
                        System.out.println("Introduce valor entre 1-15");
                }
                System.out.println("Desear seguir modificando alguna propiedad del producto actual(s/n): ");
                recoge = introduceDatos.introduceString2();
                do {
                    if (recoge.compareToIgnoreCase("s") == 0 || recoge.compareToIgnoreCase("n") == 0) {
                        listo = true;
                    } else {
                        System.out.println("Introduzca s/n por favor: ");
                        recoge = introduceDatos.introduceString2();
                    }
                } while (!listo);
            } while (recoge.compareToIgnoreCase("s") == 0);
            PeliculaJDBC.sobreescribePelicula(pelicula, codigo);//para saber la pelicula que vamos a modificar
        }
    }

    /*
     * recorremos lista con peliculas del mismo genero
    */
    @Override
    public void consultaGeneroProducto() {
        GeneroPeliculaEnum[] arrayG = rellenaArrayGenero();
        listadoGenero();
        int posicion = recogeOpcion(arrayG.length);
        GeneroPeliculaEnum genero = arrayG[posicion];
        List<Pelicula> lista = PeliculaJDBC.consultaPeliculasGenero(genero);
        if(lista.isEmpty())
            System.out.println("lista vacia");
        else
            recorreLista(lista);
    }
  
    /*
     * mostramos Pelicula encontrada a partir del codigo que recogemos
     */
    @Override
    public void consultaCodigoProducto() {
        int codigo = 0;
        codigo = recogeCodigoPelicula();
        Pelicula peli = PeliculaJDBC.obtenerPeliculaPorId(codigo);
        try{
            
            System.out.println(peli.toString());
        }catch(NullPointerException e){
            System.out.println("No existe pelicula");
        }
    }
    /*
     * muestra listado de productos filtrados por proveedor
     */
    @Override
    public void consultaProveedorProducto() {
        int codigo = 0;
        codigo = recogeCodigoProveedor();
        List<Pelicula> lista = new ArrayList();
        lista = PeliculaJDBC.consultaPeliculasProveedor(codigo);
        if(lista.isEmpty())
            System.out.println("lista vacia");
        else
            recorreLista(lista);
    }
   /*
    * recorremos lista con Peliculas del mismo año
    */
    @Override
    public void consultaAñoProducto() {
        int anno = 0;
        List<Pelicula> lista = new ArrayList();
        System.out.println("Introduce Año de Pelicula: ");
        anno = introduceDatos.introduceEntero2();
        lista = PeliculaJDBC.consultaPeliculasAnno(anno);
        if(lista.isEmpty())
            System.out.println("lista vacia");
        else
            recorreLista(lista);
    }
        
    /*
     * muestra listado de productos filtrados por franquicia
     */
    @Override
    public void consultaFranquiciaProducto() {
        int codigo = 0;
        codigo = recogeCodigoFranquicia();
        List<Pelicula> lista = new ArrayList();
        lista = PeliculaJDBC.consultaPeliculasFranquicia(codigo);
        if(lista.isEmpty())
            System.out.println("lista vacia");
        else
            recorreLista(lista);
    }
    /*
     * recorremos lista de peliculas con el mismo estado
     */
    @Override
    public void consultaEstadoProducto() {
        ProductoEnum[] arrayE = rellenaArrayProductoEnum();
        List<Pelicula> lista = new ArrayList();
        int eligeOpcion;
        ProductoEnum est;
        recorreEstadoProducto();
        eligeOpcion = recogeOpcion(arrayE.length);
        est = arrayE[eligeOpcion];
        lista = PeliculaJDBC.consultaPeliculasEstadoProducto(est);
        if(lista.isEmpty())
            System.out.println("lista vacia");
        else
            recorreLista(lista);

    }
    
    /*
     * metodo en el que damos de alta una pelicula
     */
    @Override
    public void altaProducto() {
        Pelicula pelicula = recogeDatos();
        PeliculaJDBC.insertaPelicula(pelicula);
    }
    
    /*
     * recorremos lista con peliculas del mismo nombre
     *
     */
    @Override
    public void consultaNombreProducto() {
        String nombre;
        List<Pelicula> lista = new ArrayList();
        nombre = recogeNombrePelicula();
        lista=PeliculaJDBC.consultaPeliculasNombre(nombre);
        if(lista.isEmpty())
            System.out.println("lista vacia");
        else
            recorreLista(lista);
    }
   
    
    /*
     * comprobamos que el genero introducido por el usuario exista
     * 
     * @param gen       es el genero que introduce el usuario por consola
     */
    @Override
    public boolean compruebaGenero(String gen) {
        boolean dev = false;
        for (GeneroPeliculaEnum p : GeneroPeliculaEnum.values()) {
            if (p.equals(gen)) {
                dev = true;
            }
        }
        return dev;
    }
    
    /*
     * metodo que devuelve un listado con las tarifas que se pueden aplicar en el momento 
     * en el que el metodo es invocado.
     * Si no encuentra ninguna, se le aplica una tarifa por defecto al producto.
     */
    @Override
    public List tarifasFiltroTipoProductoFecha(TipoProductoEnum producto) {
        List<Tarifa> listaT = TarifaJDBC.listadoTarifasBBDD();
        List<Tarifa> listaFiltroTarifas = new ArrayList();
        int cont = 1;
        long fechaActualSistema = System.currentTimeMillis();//guardamos fechaActual de sistema para comparar fechas de tipo long
        long fechaInicioTarifa;
        long fechaFinTarifa;
        String tipoProductoLista;
        String tipoProductoPelicula = producto.toString();
        System.out.println("---LISTADO DE TARIFAS ACTIVAS ACTUALMENTE---");
        for (Tarifa p : listaT) {
            tipoProductoLista = p.getTipoProducto().toString();
            fechaInicioTarifa = p.getFechaInicio().getTime();
            fechaFinTarifa = p.getFechaFin().getTime();
            /* Comparamos que la tarifa que recorremos sea del mismo tipo(DVD o BLUERAY) que en la pelicula que vamos a modificar su tarifa
             * Despues comparamos que la fecha actual del sistema est� comprendida dentro de los rangos
             * de fechaInicio y fechaFin de Tarifa para mostrarla (mostramos tarifas activas)
             * De esta forma, conseguimos que muestre solo las tarifas de tipo DVD � BlueRay(segun pelicula pasada al metodo)
             * que esten activas en ese momento.
             * 
             * si no hay tarifas activas, se le aplicara una tarifa por defecto.

             */
            if (tipoProductoPelicula.equalsIgnoreCase(tipoProductoLista) && fechaActualSistema > fechaInicioTarifa && fechaActualSistema < fechaFinTarifa) {
                listaFiltroTarifas.add(p);
                System.out.print(cont + ".- ");
                System.out.println(p);
                cont++;
            }
        }
        return listaFiltroTarifas;
    }
    /*
     * listado de generos de Peliculas
     */
    @Override
    public void listadoGenero() {
        int cont = 1;
        System.out.println("---GENEROS DE PELICULA---");
        for (GeneroPeliculaEnum p : GeneroPeliculaEnum.values()) {
            System.out.print(cont + ".- ");
            System.out.println(p);
            cont++;
        }
    }
    
 /*
     * metodo utilizado para dar de alta una pelicula
     */
    public Pelicula recogeDatos() {
        GeneroPeliculaEnum[] arrayG = rellenaArrayGenero();
        ProductoEnum[] arrayE = rellenaArrayProductoEnum();
        List<Tarifa> listaT;
        List<Franquicia> listaFran = FranquiciaJDBC.listadoFranquiciaBBDDAlta();
        List<Proveedor> listaProv = ProveedorJDBC.consultarProveedoresAlta();
        int eligeOpcion, eligeTipoProducto, duracion;
        boolean salir = false, dev = false, salir2=false;
        int cod = 0, edad, opcionPos, idUbi, anno, idT = 0;
        ProductoEnum est;
        String titulo, descripcion, director, reparto, nacionalidad;
        double precio=0;
        Tarifa t;
        Ubicacion ubi = new Ubicacion();
        Proveedor prov;
        Franquicia franq;
        GeneroPeliculaEnum genero;
        TipoProductoEnum tipo = null;

        cod = ProductoJDBC.devuelveUltimoId();
        System.out.println("-- ALTA PELICULA -- ");
        System.out.println("Introduce Titulo: ");
        titulo = introduceDatos.introduceString2();
        tipo= recogeTipoProductoPelicula();
        
                
        System.out.println("Introduce Sinopsis: ");
        descripcion = introduceDatos.introduceString2();
        System.out.println("Introduce Edad Recomendado: ");
        edad = introduceDatos.introduceEntero2();
        System.out.println("Introduce Precio de Compra: ");
        precio =introduceDatos.introduceEntero2();       
        recorreEstadoProducto();
        eligeOpcion = recogeOpcion(arrayE.length);
        est = arrayE[eligeOpcion];
        System.out.println(est);


        //recoge la tarifa elegida. Solo se eligiran las tarifa del tipo de producto de producto pasado
        //y que esten activas en ese momento(segun fecha del sistema)
        if (tipo.toString().equalsIgnoreCase("DVD")) {
            listaT = tarifasFiltroTipoProductoFecha(TipoProductoEnum.DVD);
        } else {
            listaT = tarifasFiltroTipoProductoFecha(TipoProductoEnum.BlueRay);
        }
        if (listaT.isEmpty()) {
            System.out.println("No se encontraron tarifas, se aplicara una por defecto");
            t = TarifaJDBC.DevuelveTarifaPorDefecto(tipo);
        } else {
            //recorreListaTarifa(listaT);
            eligeOpcion = recogeOpcion(listaT.size());
            t = listaT.get(eligeOpcion);//guarda tarifa elegida en pelicula
        }

        //recoge genero de pelicula elegido
        listadoGenero();
        eligeOpcion = recogeOpcion(arrayG.length);
        genero = arrayG[eligeOpcion];


        Franquicia franquicia = FranquiciaJDBC.obtenerFranquiciaPorId(listaFran.get(0).getId()); 
        System.out.println(franquicia.toString());
        //elegiremos la primera franquicia que este en la BBDD
        franq = listaFran.get(0);


        //recoge el proveedor elegido
        recorreListaProveedor(listaProv);
        eligeOpcion = recogeOpcion(listaProv.size());
        prov = listaProv.get(eligeOpcion);

        //recogemos resto de atributos
        System.out.println("Introduce Duracion: ");
        duracion = introduceDatos.introduceEntero2();
        System.out.println("Introduce Director: ");
        director = introduceDatos.introduceString2();
        System.out.println("Introduce Reparto: ");
        reparto = introduceDatos.introduceString2();
        System.out.println("Introduce Año: ");
        anno = introduceDatos.introduceEntero2();
        System.out.println("Introduce Nacionalidad: ");
        nacionalidad = introduceDatos.introduceString2();

        //recogemos ubicacion
        ubi = Producto.recogeUbicacion();

        return new Pelicula(cod, titulo, tipo, est, descripcion, edad, precio, t, ubi, prov, franq, duracion, director, reparto, anno, nacionalidad, genero);
    }    
        

    /*
     * metodo donde devolvemos array de genero relleno.
     * este metodo lo utilizaremos mas adelante
     */
    public GeneroPeliculaEnum[] rellenaArrayGenero() {
        GeneroPeliculaEnum[] arrayG = new GeneroPeliculaEnum[GeneroPeliculaEnum.values().length];//Guarda enumeracion de generos de pelicula
        int cont = 0;
        for (GeneroPeliculaEnum g : GeneroPeliculaEnum.values()) {
            arrayG[cont] = g;
            cont++;
        }
        return arrayG;
    }

    
    public String recogeNombrePelicula() {
        System.out.println("Introduce Nombre de Pelicula: ");
        return introduceDatos.introduceString2();

    }

    public int recogeCodigoPelicula() {
        System.out.println("Introduce Codigo de Pelicula: ");
        return introduceDatos.introduceEntero2();
    }    
    
    /*
     * muestra listado de productos filtrados por Director
     */
    public void consultaDirectorProducto(){
        String director;
        List<Pelicula> lista = new ArrayList();
        System.out.println("Introduce Nombre Director: ");
        director = introduceDatos.introduceString2();
        lista = PeliculaJDBC.consultaPeliculasDirector(director);        
        if(lista.isEmpty())
            System.out.println("lista vacia");
        else
            recorreLista(lista);
    }
    /*
     * muestra listado de productos filtrados por Actor
     */
    public void consultaActorProducto(){
        String actor;
        List<Pelicula> lista = new ArrayList();
        System.out.println("Introduce Nombre Actor: ");
        actor = introduceDatos.introduceString2();
        lista = PeliculaJDBC.consultaPeliculasReparto(actor);       
        if(lista.isEmpty())
            System.out.println("lista vacia");
        else
            recorreLista(lista);
    } 
    
    
    //recorremos la lista con peliculas del mismo tipoProducto(DVD/BLUERAY)
    public void consultaTipoProducto() throws NullPointerException {
        List<Pelicula> lista = new ArrayList();
        TipoProductoEnum tipo = recogeTipoProductoPelicula();
        lista = PeliculaJDBC.consultaPeliculasTipoProducto(tipo);
        if(lista.isEmpty())
            System.out.println("lista vacia");
        else
            recorreLista(lista);
    }    
    
    /*
     * metodo que nos devuelve el tipo de producto elegido.
     */
    public TipoProductoEnum recogeTipoProductoPelicula(){
        TipoProductoEnum tipo=null;
        int eligeTipoProducto;
        boolean salir=false;
        do {
            System.out.println("Elige tipo de Producto");
            System.out.println("1.- DVD");
            System.out.println("2.- BLUE-RAY");
            eligeTipoProducto = introduceDatos.introduceEntero2();
            switch (eligeTipoProducto) {
                case 1:
                    tipo = TipoProductoEnum.DVD;
                    salir = true;
                    break;
                case 2:
                    tipo = TipoProductoEnum.BlueRay;
                    salir = true;
                    break;
            }
        } while (!salir);
        return tipo;        
    }    
    
    /*
     * menu de busqueda de pelicula
     */
   public static void menuBuscaPelicula() {
        String recoge;
        boolean listo = false;
        Pelicula peli = new Pelicula();
        int op = 0;
        do{
            do {
                System.out.println("--BUSQUEDA PELICULA--");
                System.out.println("[1] Por codigo");
                System.out.println("[2] Por Año");
                System.out.println("[3] Por Director");
                System.out.println("[4] Por Franquicia");
                System.out.println("[5] Por Proveedor");
                System.out.println("[6] Por Genero");
                System.out.println("[7] Por TipoProducto(DVD/BLUERAY)");
                System.out.println("[8] Por Estado del Producto");
                System.out.println("[9] Por Reparto(Actor)");
                System.out.println("[10] Por Titulo");
                System.out.print(">>> Seleccione una opción: ");
                op = introduceDatos.introduceEntero2();
            } while (op > 10 || op < 1);
            switch(op)
            {
                case 1:peli.consultaCodigoProducto();break;
                case 2:peli.consultaAñoProducto();break;
                case 3:peli.consultaDirectorProducto();break;
                case 4:peli.consultaFranquiciaProducto();break;
                case 5:peli.consultaProveedorProducto();break;
                case 6:peli.consultaGeneroProducto();break;
                case 7:peli.consultaTipoProducto();break;
                case 8: peli.consultaEstadoProducto();break;
                case 9: peli.consultaActorProducto();break;
                case 10: peli.consultaNombreProducto();break;
            }
            System.out.println("\nDesear seguir buscando algun producto mas(s/n): ");
            recoge = introduceDatos.introduceString2();
            do {
                if (recoge.compareToIgnoreCase("s") == 0 || recoge.compareToIgnoreCase("n") == 0) {
                    listo = true;
                } else {
                    System.out.println("Introduzca s/n por favor: ");
                    recoge = introduceDatos.introduceString();
                }
            } while (!listo);
        } while (recoge.compareToIgnoreCase("s") == 0);
    }


}
